package com.zhubayi.daka.utils;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import com.zhubayi.daka.pojo.DateTable;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.HttpClientUtils;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.seimicrawler.xpath.JXDocument;
import org.seimicrawler.xpath.JXNode;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import sun.security.util.ArrayUtil;

/**
 * @author 祝八一
 */
@Component
public class DakaUtil {
    @Value("${daka.baseUrl}")
    private String baseUrl;
    private final String agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36";

    /**
     * 获取验证码和cookie
     * @return
     */
    public ConcurrentMap<String,String> getCookieAndCode(){
        //1.生成httpclient，相当于该打开一个浏览器
        //为了获取cookie
        BasicCookieStore cookieStore = new BasicCookieStore();
        CloseableHttpClient httpClient =  HttpClients.custom().setDefaultCookieStore(cookieStore).build();
        CloseableHttpResponse response = null;
        //2.创建get请求，相当于在浏览器地址栏输入 网址
        HttpGet request = new HttpGet(baseUrl+"/com_user/weblogin.asp");
        ConcurrentMap<String, String> map = new ConcurrentHashMap<>();
        try {
            //3.执行get请求，相当于在输入地址栏后敲回车键

            response = httpClient.execute(request);
            //4.判断响应状态为200，进行处理
            if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                //5.获取响应内容
                HttpEntity httpEntity = response.getEntity();
                // 解析网页 得到文档对象
                String html = EntityUtils.toString(httpEntity, "utf-8");
                Document doc = Jsoup.parse(html);
                //获取验证码
                String code=doc.getElementsByClass("form-bottom").eq(0).text().substring(2,6);
                // 获取cookies信息
                List<Cookie> cookies = cookieStore.getCookies();
                map.put("code",code);

                for (Cookie cookie : cookies) {
                    String name = cookie.getName();
                    String value = cookie.getValue();
                    map.put(name,value);
                  //  System.out.println("cookies: key= "+ name + "  value= " + value);
                }
                return map;
//                System.out.println(doc.getElementsByClass("form-bottom").eq(0).text().substring(2,6));
            } else {
                //如果返回状态不是200，比如404（页面不存在）等，根据情况做处理，这里略
                System.out.println("返回状态不是200");
                System.out.println(EntityUtils.toString(response.getEntity(), "utf-8"));
                return null;
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //6.关闭
            HttpClientUtils.closeQuietly(response);
            HttpClientUtils.closeQuietly(httpClient);
            return map;
        }
    }

    /**
     * 登录和打卡
     */
    public ConcurrentMap<String,Object> loginAndDaka(String username, String password){
        ConcurrentMap<String, String> cookieAndCode = getCookieAndCode();
        ConcurrentMap<String, Object> map = new ConcurrentHashMap<>();
        String code = cookieAndCode.get("code");
        cookieAndCode.remove("code");
        ConcurrentMap<String,String> datas=new ConcurrentHashMap<>();
        if (code==null){
            code="";
        }
        datas.put("code",code);
        datas.put("username",username);
        datas.put("userpwd",password);
        datas.put("login","login");
        datas.put("rank","0");
        datas.put("action","login");
        datas.put("m5","1");
        Connection connect = Jsoup.connect(baseUrl+"/com_user/weblogin.asp");
        Connection.Response login = null;
        try {
            login = connect.ignoreContentType(true).method(Connection.Method.POST).data(datas).cookies(cookieAndCode).execute();
            Document doc = login.parse();
            String title = doc.getElementsByTag("title").text();
            if (!"管理系统".equals(title)){
                map.put("msg","密码不对!");
                return map;
            }
            //System.out.println(doc.getElementsByTag("title").text());
          //  System.out.println(login.body());
        } catch (IOException e) {
            e.printStackTrace();
        }
        //System.out.println(login.body());
//        Map<String, String> map = login.cookies();
//        for (String s : map.keySet()) {
//            System.out.println(s + "      " + map.get(s));
//        }
        //打卡
        String id = getId(cookieAndCode);
        String msg = daka(cookieAndCode, id);
        //存入数据

        List<DateTable> table = getTable(id, cookieAndCode);
        map.put("msg",msg);
        map.put("table",table);
        return map;
    }

    /**
     * 打卡
     */
    public String daka(ConcurrentMap<String,String> cookies, String id){
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年M月dd日");
        String date = dateFormat.format(new Date());
        Connection connect = Jsoup.connect(baseUrl+"/com_user/project_addx.asp?id="+id+"&id2="+date+"&adds=undefined&addsxy=undefined").userAgent(agent);;
        Connection.Response result = null;
        try {

            result = connect.ignoreContentType(true).method(Connection.Method.GET).cookies(cookies).execute();
            if (result.statusCode()==200){
                Document doc = result.parse();
                Element body = doc.select("body").get(0);
                String[] str = body.data().split("'");
                return str[1];
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "打卡失败";
    }
    public String getId(ConcurrentMap<String,String> cookies){
        Connection connect = Jsoup.connect(baseUrl+"/com_user/left.asp").userAgent(agent);
        Connection.Response result = null;
        try {
            result = connect.ignoreContentType(true).method(Connection.Method.GET).cookies(cookies).execute();
            if (result.statusCode()==200){
                Document doc = result.parse();
                //第25个才是打卡地址所在 找到id
                Elements elements = doc.getElementsByClass("navigation").eq(2).tagName("a");
               // System.out.println(elements);
                String href = elements.select("a >a").attr("href");
                String id=href.split("=")[1];
                return id;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }
    public  List<DateTable> getTable(String id,ConcurrentMap<String,String> cookies ){
        Connection connect = Jsoup.connect(baseUrl+"/com_user/project.asp?id="+id).userAgent(agent);
        Connection.Response result = null;
        List<DateTable> dateTables = new ArrayList<>();
        try {
            result = connect.ignoreContentType(true).method(Connection.Method.GET).cookies(cookies).execute();
            if (result.statusCode()==200){
                Document doc = result.parse();
                //第25个才是打卡地址所在 找到id
              //  Elements elements = doc.getElementsByTag("table").eq(3).select("tr");
                Elements elements = doc.getElementsByClass("card-body").select("tbody").select("tr");
                elements.remove(0);
                elements.remove(0);
                String text = elements.text();
//                System.out.println(text);
                String replace = text.replace("删除 ", "").replace("请确认信息是否无误 ","请确认信息是否无误");
                String[] str = replace.split(" ");
                int a=0;
                for (int i = 1; i <= str.length/8; i++) {
                    DateTable dateTable = new DateTable();
                    dateTable.setDateOfRegistration(str[0+a]);
                    dateTable.setLocation(str[1+a]);
                    dateTable.setHistoryOfSojourn(str[2+a]);
                    dateTable.setContactHistory(str[3+a]);
                    dateTable.setHistoryOfContacts(str[4+a]);
                    dateTable.setPhysicalCondition(str[5+a]);
                    dateTable.setRegistrationMethod(str[6+a]);
                    dateTable.setOperation(str[7+a]);
                    dateTables.add(dateTable);
                   a=i*8;
                }

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return dateTables;
    }

    public static void main(String[] args) {
        String str1="2021年2月16日 四川省|广安市|华莹市 否 否 否 否 主动登记 删除 信息已备案 2021年2月15日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月14日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月13日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月12日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月11日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月10日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月9日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月8日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月7日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月6日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月5日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月4日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月3日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月2日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月1日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案";
        String str2="2021年2月17日 四川省|广安市|华莹市 否 否 否 否 主动登记 请确认信息是否无误 14分钟内可删除并重新登记 删除 2021年2月16日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月15日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月14日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月13日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月12日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月11日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月10日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月9日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月8日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月7日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月6日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月5日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月4日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月3日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月2日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案 2021年2月1日 四川省|广安市|华莹市 否 否 否 否 主动登记 信息已备案";
        String s = str2.replace("删除 ", "").replace("请确认信息是否无误 ","请确认信息是否无误");
      //  System.out.println(s);
        //String[] str = elements.text().split(" ");
        String[] str = s.split(" ");
        List<DateTable> dateTables = new ArrayList<>();
        int a=0;
        for (int i = 1; i <= str.length/8; i++) {
          //  for (int j = 0; j < 8 ; j++) {
                DateTable dateTable = new DateTable();
                dateTable.setDateOfRegistration(str[0+a]);
                dateTable.setLocation(str[1+a]);
                dateTable.setHistoryOfSojourn(str[2+a]);
                dateTable.setContactHistory(str[3+a]);
                dateTable.setHistoryOfContacts(str[4+a]);
                dateTable.setPhysicalCondition(str[5+a]);
                dateTable.setRegistrationMethod(str[6+a]);
                dateTable.setOperation(str[7+a]);
            dateTables.add(dateTable);
          //  }
            a=i*8;
        }
       System.out.println(dateTables);
//        for (int i = 0; i < str.length; i++) {
//            System.out.print(str[i]);
//            if(i%8==0 &&i!=0){
//                System.out.println();
//            }
//        }
        //System.out.println(s);
    }


}
